/**
 * 通用数据模型
 * 支持文本文档、分镜脚本、数据采集等所有模块的统一数据结构
 */

/**
 * 内容类型枚举
 */
export enum ContentType {
  TEXT_DOCUMENT = 'text_document',      // 文本稿件
  STORYBOARD = 'storyboard',           // 分镜脚本
  DATA_COLLECTION = 'data_collection'   // 数据采集任务
}

/**
 * 基础内容项接口
 * 所有类型内容的通用基础结构
 */
export interface BaseContent {
  /** 内容唯一标识符 */
  id: string
  
  /** 内容类型 */
  type: ContentType
  
  /** 内容标题 */
  title: string
  
  /** 内容描述 */
  description?: string
  
  /** 创建时间 */
  createdAt: Date
  
  /** 最后修改时间 */
  updatedAt: Date
  
  /** 内容状态 */
  status: ContentStatus
  
  /** 标签 */
  tags: string[]
  
  /** 自定义元数据 */
  metadata: Record<string, any>
}

/**
 * 内容状态枚举
 */
export enum ContentStatus {
  DRAFT = 'draft',           // 草稿
  IN_PROGRESS = 'in_progress', // 进行中
  COMPLETED = 'completed',   // 已完成
  PUBLISHED = 'published',   // 已发布
  ARCHIVED = 'archived'      // 已归档
}

/**
 * 文本文档特定数据
 */
export interface TextDocumentData {
  /** HTML 内容（富文本编辑器生成，Markdown仅用于导出） */
  content: string

  /** 字数统计 */
  wordCount: number

  /** AI 辅助信息 */
  aiAssistance?: {
    lastAIEditAt?: Date
    aiSuggestionCount?: number
    aiModel?: string
  }
}

/**
 * 宽高比枚举
 */
export enum AspectRatio {
  STANDARD = '16:9',     // 标准宽屏
  VERTICAL = '9:16',     // 竖屏（手机）
  SQUARE = '1:1',        // 方形
  CINEMA = '21:9',       // 电影宽屏
  TRADITIONAL = '4:3'     // 传统电视
}

/**
 * 视频分辨率枚举
 */
export enum VideoResolution {
  HD_720P = '1280x720',
  FULL_HD = '1920x1080',
  QHD = '2560x1440',
  UHD_4K = '3840x2160',
  DCI_4K = '4096x2160',
  UHD_8K = '7680x4320'
}

/**
 * 镜头类型枚举
 */
export enum ShotType {
  EXTREME_WIDE = 'extreme_wide',     // 超远景
  WIDE = 'wide',                     // 远景
  MEDIUM_WIDE = 'medium_wide',       // 中远景
  MEDIUM = 'medium',                 // 中景
  MEDIUM_CLOSE = 'medium_close',     // 中近景
  CLOSE_UP = 'close_up',            // 近景
  EXTREME_CLOSE = 'extreme_close',   // 特写
  DETAIL = 'detail'                  // 细节
}

/**
 * 拍摄角度枚举
 */
export enum CameraAngle {
  EYE_LEVEL = 'eye_level',          // 平视
  HIGH_ANGLE = 'high_angle',        // 俯拍
  LOW_ANGLE = 'low_angle',          // 仰拍
  BIRD_EYE = 'bird_eye',           // 鸟瞰
  WORM_EYE = 'worm_eye',           // 虫视
  DUTCH_ANGLE = 'dutch_angle',      // 荷兰角
  OVER_SHOULDER = 'over_shoulder'   // 过肩镜头
}

/**
 * 镜头运动枚举
 */
export enum CameraMovement {
  STATIC = 'static',                // 固定
  PAN_LEFT = 'pan_left',           // 左摇
  PAN_RIGHT = 'pan_right',         // 右摇
  TILT_UP = 'tilt_up',            // 上摇
  TILT_DOWN = 'tilt_down',         // 下摇
  ZOOM_IN = 'zoom_in',            // 推镜
  ZOOM_OUT = 'zoom_out',          // 拉镜
  DOLLY_IN = 'dolly_in',          // 推车进
  DOLLY_OUT = 'dolly_out',        // 推车出
  TRACKING = 'tracking',           // 跟拍
  HANDHELD = 'handheld',          // 手持
  DRONE = 'drone',                // 无人机
  CRANE = 'crane'                 // 摇臂
}

/**
 * 道具分类枚举
 */
export enum PropCategory {
  FURNITURE = 'furniture',       // 家具
  VEHICLE = 'vehicle',          // 交通工具
  CLOTHING = 'clothing',        // 服装道具
  WEAPON = 'weapon',           // 武器道具
  FOOD = 'food',               // 食物道具
  TECHNOLOGY = 'technology',    // 科技产品
  DECORATION = 'decoration',    // 装饰用品
  DOCUMENT = 'document',        // 文件资料
  OTHER = 'other'              // 其他
}

/**
 * 地点类型枚举
 */
export enum LocationType {
  INTERIOR = 'interior',        // 室内
  EXTERIOR = 'exterior',        // 室外
  STUDIO = 'studio',           // 摄影棚
  NATURAL = 'natural',         // 自然景观
  URBAN = 'urban',             // 城市环境
  HISTORICAL = 'historical',   // 历史建筑
  VIRTUAL = 'virtual'          // 虚拟场景
}

/**
 * 光照条件枚举
 */
export enum LightingCondition {
  NATURAL_DAY = 'natural_day',      // 自然光（日间）
  NATURAL_NIGHT = 'natural_night',  // 自然光（夜间）
  ARTIFICIAL = 'artificial',        // 人工照明
  MIXED = 'mixed',                 // 混合照明
  LOW_LIGHT = 'low_light',         // 弱光环境
  HIGH_CONTRAST = 'high_contrast', // 高对比度
  SOFT_LIGHT = 'soft_light'        // 柔光
}

/**
 * 转场类型枚举
 */
export enum TransitionType {
  CUT = 'cut',                     // 直切
  FADE_IN = 'fade_in',            // 淡入
  FADE_OUT = 'fade_out',          // 淡出
  DISSOLVE = 'dissolve',          // 叠化
  WIPE = 'wipe',                  // 擦除
  SLIDE = 'slide',                // 滑动
  PUSH = 'push',                  // 推拉
  ZOOM = 'zoom'                   // 缩放
}

/**
 * 角色信息接口
 */
export interface Character {
  id: string
  name: string                    // 角色名称
  description?: string           // 角色描述
  actor?: string                // 演员
  costume?: string              // 服装要求
  makeup?: string               // 化妆要求
  characterArc?: string         // 角色弧线
  avatar?: string               // 角色头像
}

/**
 * 场景中的角色
 */
export interface SceneCharacter extends Pick<Character, 'id' | 'name'> {
  role: 'main' | 'supporting' | 'background'  // 在此场景中的重要性
  action?: string                             // 在此场景中的动作
  emotion?: string                           // 情绪状态
  position?: string                          // 在画面中的位置
}

/**
 * 道具信息接口
 */
export interface Prop {
  id: string
  name: string                   // 道具名称
  category: PropCategory        // 道具分类
  description?: string          // 描述
  requirements?: string         // 特殊要求
  source?: 'purchase' | 'rent' | 'make' | 'existing'  // 获取方式
}

/**
 * 场景中的道具
 */
export interface SceneProp extends Pick<Prop, 'id' | 'name'> {
  importance: 'hero' | 'featured' | 'background'  // 重要性
  condition?: string                              // 所需状态
  notes?: string                                 // 备注
}

/**
 * 地点信息接口
 */
export interface Location {
  id: string
  name: string                   // 地点名称
  type: LocationType            // 地点类型
  address?: string              // 地址
  description?: string          // 描述
  permits?: string[]           // 所需许可证
  contact?: string             // 联系方式
  availability?: TimeSlot[]    // 可用时间段
  facilities?: string[]        // 设施条件
}

/**
 * 时间段接口
 */
export interface TimeSlot {
  start: Date
  end: Date
  available: boolean
}

/**
 * 对白接口
 */
export interface Dialogue {
  character: string             // 说话角色
  text: string                 // 对白内容
  delivery?: string            // 说话方式（温柔、愤怒等）
  language?: string           // 语言
  subtitle?: boolean          // 是否需要字幕
}

/**
 * 音乐提示接口
 */
export interface MusicCue {
  track?: string              // 音乐曲目
  mood: string               // 情绪氛围
  volume: 'low' | 'medium' | 'high'  // 音量级别
  timing: 'start' | 'middle' | 'end' | 'throughout'  // 播放时机
  fadeIn?: boolean           // 是否淡入
  fadeOut?: boolean          // 是否淡出
}

/**
 * 音效提示接口
 */
export interface SoundCue {
  effect: string             // 音效名称
  source?: string           // 音效来源
  volume: 'low' | 'medium' | 'high'  // 音量级别
  timing: 'start' | 'middle' | 'end' | 'throughout'  // 播放时机
}

/**
 * 设备接口
 */
export interface Equipment {
  id: string
  name: string              // 设备名称
  category: string         // 设备类别
  specifications?: string  // 技术规格
  quantity?: number       // 所需数量
}

/**
 * 工作人员接口
 */
export interface CrewMember {
  id: string
  name: string             // 姓名
  role: string            // 职位
  contact?: string        // 联系方式
  availability?: TimeSlot[] // 可用时间
}

/**
 * 音乐轨道接口
 */
export interface MusicTrack {
  id: string
  title: string           // 音乐标题
  artist?: string        // 艺术家
  duration: number       // 时长（秒）
  mood: string[]         // 情绪标签
  genre?: string         // 音乐类型
}

/**
 * 音效接口
 */
export interface SoundEffect {
  id: string
  name: string           // 音效名称
  category: string       // 音效类别
  duration?: number      // 时长（秒）
  tags: string[]         // 标签
}

/**
 * 审批评论接口
 */
export interface ApprovalComment {
  id: string
  author: string
  content: string
  timestamp: Date
  type: 'general' | 'technical' | 'creative' | 'production'
}

/**
 * AI生成元数据接口
 */
export interface AIGeneratedMetadata {
  generatedBy: 'ai_script_to_storyboard' | 'ai_creative_expansion' | 'ai_optimization'
  aiModel: string
  generatedAt: Date
  confidence: number        // 0-1, AI生成置信度
  humanReviewed: boolean   // 是否经过人工审核
  originalPrompt?: string  // 原始提示词
}

/**
 * 分镜脚本特定数据
 */
export interface StoryboardData {
  /** 分镜场景列表 */
  scenes: StoryboardScene[]
  
  /** 总时长（秒）- 自动计算 */
  totalDuration: number
  
  /** 视频格式配置 */
  videoFormat: {
    aspectRatio: AspectRatio        // 宽高比枚举
    resolution: VideoResolution     // 分辨率枚举  
    frameRate: number              // 帧率 (24/25/30/60)
    colorSpace?: 'Rec709' | 'Rec2020' | 'DCI-P3'  // 色彩空间
  }
  
  /** 拍摄计划 */
  shootingPlan?: {
    estimatedBudget?: number       // 预估预算
    requiredEquipment: Equipment[] // 所需设备列表
    shootingDays: number          // 拍摄天数
    locations: Location[]         // 拍摄地点详情
    crew: CrewMember[]           // 工作人员安排
  }
  
  /** 项目资源库 */
  projectAssets: {
    characters: Character[]       // 角色库
    props: Prop[]                // 道具库
    locations: Location[]        // 地点库
    music: MusicTrack[]         // 音乐库
    soundEffects: SoundEffect[] // 音效库
  }
  
  /** 导出设置 */
  exportSettings?: {
    defaultFormat: 'pdf' | 'excel' | 'fdx'  // 默认导出格式
    includeNotes: boolean                    // 是否包含备注
    includeThumbnails: boolean              // 是否包含缩略图
    pageLayout: 'standard' | 'compact'     // 页面布局
  }
}

/**
 * 分镜场景接口
 */
export interface StoryboardScene {
  // === 基础标识 ===
  id: string
  title: string
  description: string
  
  // === 排序和分组 ===
  order: number
  groupId?: string              // 场景分组ID（用于章节管理）
  
  // === 镜头技术参数 ===
  shot: {
    type: ShotType             // 景别类型
    angle: CameraAngle        // 拍摄角度
    movement?: CameraMovement // 镜头运动
    lens?: string            // 镜头类型
    focusType?: string       // 对焦方式
  }
  
  // === 时间信息 ===
  timing: {
    duration: number         // 场景时长（秒）
    startTime?: number      // 在项目中的开始时间（用于时间线）
    speed?: 'normal' | 'slow' | 'fast' | 'timelapse'  // 播放速度
  }
  
  // === 空间信息 ===
  sceneLocation: {
    id?: string             // 关联地点库ID
    name: string           // 地点名称
    type: LocationType     // 地点类型
    description?: string   // 地点描述
    lighting: LightingCondition  // 光照条件
  }
  
  // === 人物和道具 ===
  elements: {
    characters: SceneCharacter[]  // 出场角色
    props: SceneProp[]           // 使用道具
    vehicles?: string[]         // 交通工具
  }
  
  // === 音频信息 ===
  audioElements: {
    dialogue?: Dialogue[]        // 对白列表
    narration?: string          // 旁白
    music?: MusicCue[]         // 音乐提示
    soundEffects?: SoundCue[]  // 音效提示
    ambientSound?: string      // 环境音
  }
  
  // === 视觉效果 ===
  visual: {
    colorGrading?: string   // 调色方案
    visualEffects?: string[] // 视觉特效
    transitions?: {              // 转场效果
      in?: TransitionType
      out?: TransitionType
    }
  }
  
  // === 制作信息 ===
  production: {
    priority: 'low' | 'normal' | 'high' | 'urgent'  // 拍摄优先级
    complexity: 'simple' | 'medium' | 'complex'      // 复杂度评估
    estimatedTime?: number                           // 预估拍摄时间（分钟）
    requiredCrew: string[]                          // 所需工作人员
    specialRequirements?: string[]                  // 特殊要求
  }
  
  // === 附件和备注 ===
  attachments: {
    thumbnail?: string          // 缩略图/分镜画
    referenceImages?: string[]  // 参考图片
    storyboard?: string        // 手绘分镜图
    notes?: string            // 备注
    tags?: string[]          // 标签
  }
  
  // === 审批状态 ===
  approval?: {
    status: 'draft' | 'review' | 'approved' | 'changes_requested'
    reviewedBy?: string
    reviewedAt?: Date
    comments?: ApprovalComment[]
  }
  
  // === AI元数据 ===
  aiMetadata?: AIGeneratedMetadata
  
  // === 向后兼容字段（带@deprecated标记） ===
  /** @deprecated 使用 shot.type */
  shotType?: 'wide' | 'medium' | 'close' | 'extreme_close' | 'overhead'
  /** @deprecated 使用 shot.angle */
  angle?: 'eye_level' | 'high' | 'low' | 'dutch'
  /** @deprecated 使用 shot.movement */
  movement?: 'static' | 'pan' | 'tilt' | 'zoom' | 'tracking'
  /** @deprecated 使用 timing.duration */
  duration?: number
  /** @deprecated 使用 sceneLocation.name */
  location?: string
  /** @deprecated 使用 elements.props */
  props?: string[]
  /** @deprecated 使用 elements.characters */
  characters?: string[]
  /** @deprecated 使用 audioElements.dialogue */
  dialogue?: string
  /** @deprecated 使用 audioElements.soundEffects */
  audio?: string
  /** @deprecated 使用 attachments.notes */
  notes?: string
  /** @deprecated 使用 attachments.thumbnail */
  thumbnail?: string
}

/**
 * 数据采集任务特定数据
 */
export interface DataCollectionData {
  /** 采集任务类型 */
  taskType: 'hot_topics' | 'content_tracking' | 'competitor_analysis'
  
  /** 目标平台 */
  targetPlatforms: Platform[]
  
  /** 采集配置 */
  config: DataCollectionConfig
  
  /** 执行状态 */
  execution: {
    lastRunAt?: Date
    nextRunAt?: Date
    isRunning: boolean
    progress: number // 0-100
    results?: DataCollectionResult[]
  }
}

/**
 * 平台枚举
 */
export enum Platform {
  WEIBO = 'weibo',           // 微博
  DOUYIN = 'douyin',         // 抖音
  XIAOHONGSHU = 'xiaohongshu', // 小红书
  ZHIHU = 'zhihu',           // 知乎
  BILIBILI = 'bilibili',     // B站
  WECHAT = 'wechat',         // 微信
  KUAISHOU = 'kuaishou',     // 快手
  TOUTIAO = 'toutiao'        // 今日头条
}

/**
 * 数据采集配置
 */
export interface DataCollectionConfig {
  /** 采集频率（分钟） */
  interval: number
  
  /** 关键词列表 */
  keywords: string[]
  
  /** 采集数量限制 */
  limit: number
  
  /** 过滤条件 */
  filters: {
    minLikes?: number
    minComments?: number
    minShares?: number
    timeRange?: {
      start: Date
      end: Date
    }
  }
}

/**
 * 数据采集结果
 */
export interface DataCollectionResult {
  id: string
  platform: Platform
  url: string
  title: string
  content: string
  author: string
  publishedAt: Date
  metrics: {
    likes: number
    comments: number
    shares: number
    views?: number
  }
  collectedAt: Date
}

/**
 * 统一内容接口
 * 使用联合类型根据内容类型包含特定数据
 */
export type Content = BaseContent & (
  | { type: ContentType.TEXT_DOCUMENT; data: TextDocumentData }
  | { type: ContentType.STORYBOARD; data: StoryboardData }
  | { type: ContentType.DATA_COLLECTION; data: DataCollectionData }
)

/**
 * 创建内容输入接口
 */
export interface CreateContentInput<T extends ContentType> {
  type: T
  title: string
  description?: string
  tags?: string[]
  metadata?: Record<string, any>
  data: T extends ContentType.TEXT_DOCUMENT 
    ? Partial<TextDocumentData>
    : T extends ContentType.STORYBOARD
    ? Partial<StoryboardData>
    : T extends ContentType.DATA_COLLECTION
    ? Partial<DataCollectionData>
    : never
}

/**
 * 更新内容输入接口
 */
export interface UpdateContentInput<T extends ContentType> {
  title?: string
  description?: string
  status?: ContentStatus
  tags?: string[]
  metadata?: Record<string, any>
  data?: T extends ContentType.TEXT_DOCUMENT 
    ? Partial<TextDocumentData>
    : T extends ContentType.STORYBOARD
    ? Partial<StoryboardData>
    : T extends ContentType.DATA_COLLECTION
    ? Partial<DataCollectionData>
    : never
}

/**
 * 内容列表项（用于列表显示）
 */
export interface ContentListItem {
  id: string
  type: ContentType
  title: string
  description?: string
  status: ContentStatus
  tags: string[]
  createdAt: Date
  updatedAt: Date
  /** 类型特定的摘要信息 */
  summary: string
}

/**
 * 内容查询参数
 */
export interface ContentQuery {
  /** 内容类型过滤 */
  type?: ContentType[]
  
  /** 状态过滤 */
  status?: ContentStatus[]
  
  /** 标签过滤 */
  tags?: string[]
  
  /** 搜索关键词 */
  keyword?: string
  
  /** 排序方式 */
  sortBy?: 'createdAt' | 'updatedAt' | 'title' | 'status'
  
  /** 排序顺序 */
  sortOrder?: 'asc' | 'desc'
  
  /** 分页参数 */
  limit?: number
  offset?: number
  
  /** 时间范围 */
  dateRange?: {
    start: Date
    end: Date
  }
}

/**
 * 存储适配器接口（支持所有内容类型）
 */
export interface UniversalStorageAdapter {
  /** 获取内容列表 */
  getContents(query?: ContentQuery): Promise<ContentListItem[]>
  
  /** 根据ID获取单个内容 */
  getContent(id: string): Promise<Content | null>
  
  /** 创建新内容 */
  createContent<T extends ContentType>(input: CreateContentInput<T>): Promise<Content>
  
  /** 更新内容 */
  updateContent<T extends ContentType>(id: string, input: UpdateContentInput<T>): Promise<Content>
  
  /** 删除内容 */
  deleteContent(id: string): Promise<boolean>
  
  /** 批量操作 */
  batchUpdate(operations: BatchOperation[]): Promise<boolean>
  
  /** 导出数据 */
  exportData(format: 'json' | 'csv' | 'xlsx'): Promise<Blob>
  
  /** 导入数据 */
  importData(data: Blob, format: 'json' | 'csv' | 'xlsx'): Promise<string[]>
}

/**
 * 批量操作接口
 */
export interface BatchOperation {
  type: 'create' | 'update' | 'delete'
  id?: string
  data?: any
}

/**
 * 模板分类枚举
 */
export enum TemplateCategory {
  NEWS = 'news',                // 新闻类
  REPORT = 'report',            // 报告类
  BLOG = 'blog',                // 博客类
  MEETING = 'meeting',          // 会议类
  MARKETING = 'marketing',      // 营销类
  ACADEMIC = 'academic',        // 学术类
  BUSINESS = 'business',        // 商务类
  PERSONAL = 'personal',        // 个人类
  CUSTOM = 'custom'             // 自定义类
}

/**
 * 模板类型标签
 */
export enum TemplateLabelType {
  FORMAL = 'formal',            // 正式文档
  CASUAL = 'casual',            // 休闲文档
  TECHNICAL = 'technical',      // 技术文档
  CREATIVE = 'creative',        // 创意文档
  STRUCTURED = 'structured'     // 结构化文档
}

/**
 * 模板元数据
 */
export interface TemplateMetadata {
  author?: string               // 作者
  version: string               // 版本号
  estimatedLength?: number      // 预估长度(字数)
  difficulty: 'easy' | 'medium' | 'hard'  // 难度级别
  language: 'zh-CN' | 'en-US'   // 语言
  license?: string              // 许可证
}

/**
 * 文档模板数据类型
 */
export interface DocumentTemplate {
  id: string                    // 模板唯一标识
  name: string                  // 模板名称
  description?: string          // 模板描述
  category: TemplateCategory    // 模板分类
  type: TemplateLabelType       // 模板类型标签
  contentType: ContentType      // 内容类型
  content: string               // 模板内容
  metadata: TemplateMetadata    // 模板元数据
  isBuiltIn: boolean           // 是否为内置模板
  createdAt: Date              // 创建时间
  updatedAt: Date              // 更新时间
  usageCount: number           // 使用次数
  tags: string[]               // 标签
}

/**
 * 预设模板配置
 */
export interface BuiltInTemplateConfig {
  id: string
  name: string
  description: string
  category: TemplateCategory
  type: TemplateLabelType
  content: string
  metadata: TemplateMetadata
  tags: string[]
}

/**
 * 模板统计信息
 */
export interface TemplateStats {
  totalTemplates: number        // 总模板数
  builtInTemplates: number      // 内置模板数
  customTemplates: number       // 自定义模板数
  categoryCounts: Record<TemplateCategory, number>  // 分类统计
  mostUsedTemplates: DocumentTemplate[]  // 最常用模板
}

/**
 * 模板查询过滤器
 */
export interface TemplateFilters {
  category?: TemplateCategory[]
  type?: TemplateLabelType[]
  tags?: string[]
  contentType?: ContentType[]
  difficulty?: TemplateMetadata['difficulty'][]
  language?: TemplateMetadata['language'][]
  isBuiltIn?: boolean
}

/**
 * 数据模型版本管理
 */
export const DATA_MODEL_VERSION = '2.0.0'

/**
 * 向后兼容的文档接口（保留原有接口）
 */
export interface Document extends BaseContent {
  type: ContentType.TEXT_DOCUMENT
  data: TextDocumentData
}

// 保持向后兼容的类型别名
export type CreateDocumentInput = CreateContentInput<ContentType.TEXT_DOCUMENT>
export type UpdateDocumentInput = UpdateContentInput<ContentType.TEXT_DOCUMENT>
export type DocumentListItem = ContentListItem
export type DocumentListQuery = ContentQuery
export type StorageAdapter = UniversalStorageAdapter

/**
 * 工具函数：生成唯一ID
 */
export function generateId(): string {
  return Date.now().toString(36) + Math.random().toString(36).substr(2, 9)
}

/**
 * 创建默认场景
 */
export function createDefaultScene(order: number): StoryboardScene {
  return {
    id: generateId(),
    title: `场景 ${order + 1}`,
    description: '',
    order,
    shot: {
      type: ShotType.MEDIUM,
      angle: CameraAngle.EYE_LEVEL
    },
    timing: {
      duration: 5
    },
    sceneLocation: {
      name: '',
      type: LocationType.INTERIOR,
      lighting: LightingCondition.NATURAL_DAY
    },
    elements: {
      characters: [],
      props: []
    },
    audioElements: {},
    visual: {},
    production: {
      priority: 'normal',
      complexity: 'simple',
      requiredCrew: []
    },
    attachments: {}
  }
}

/**
 * 创建默认分镜项目
 */
export function createDefaultStoryboard(): StoryboardData {
  return {
    scenes: [],
    totalDuration: 0,
    videoFormat: {
      aspectRatio: AspectRatio.STANDARD,
      resolution: VideoResolution.FULL_HD,
      frameRate: 25
    },
    projectAssets: {
      characters: [],
      props: [],
      locations: [],
      music: [],
      soundEffects: []
    }
  }
}

/**
 * 计算分镜总时长
 */
export function calculateTotalDuration(scenes: StoryboardScene[]): number {
  return scenes.reduce((total, scene) => {
    const duration = scene.timing?.duration || scene.duration || 0
    return total + duration
  }, 0)
}

/**
 * 向后兼容：从旧版场景创建新版场景
 */
export function migrateSceneToV2(oldScene: Partial<StoryboardScene>): StoryboardScene {
  return {
    id: oldScene.id || generateId(),
    title: oldScene.title || '',
    description: oldScene.description || '',
    order: oldScene.order || 0,
    shot: {
      type: oldScene.shotType ? convertLegacyShotType(oldScene.shotType) : ShotType.MEDIUM,
      angle: oldScene.angle ? convertLegacyAngle(oldScene.angle) : CameraAngle.EYE_LEVEL,
      movement: oldScene.movement ? convertLegacyMovement(oldScene.movement) : undefined
    },
    timing: {
      duration: oldScene.duration || oldScene.timing?.duration || 5
    },
    sceneLocation: {
      name: oldScene.location || '',
      type: LocationType.INTERIOR,
      lighting: LightingCondition.NATURAL_DAY
    },
    elements: {
      characters: (oldScene.characters || []).map(char => ({
        id: generateId(),
        name: char,
        role: 'main' as const
      })),
      props: (oldScene.props || []).map(prop => ({
        id: generateId(),
        name: prop,
        importance: 'featured' as const
      }))
    },
    audioElements: {
      dialogue: oldScene.dialogue ? [{
        character: '',
        text: oldScene.dialogue
      }] : undefined
    },
    visual: {},
    production: {
      priority: 'normal',
      complexity: 'simple',
      requiredCrew: []
    },
    attachments: {
      thumbnail: oldScene.thumbnail,
      notes: oldScene.notes
    },
    // 保留兼容字段
    shotType: oldScene.shotType,
    angle: oldScene.angle,
    movement: oldScene.movement,
    duration: oldScene.duration,
    location: oldScene.location,
    props: oldScene.props,
    characters: oldScene.characters,
    dialogue: oldScene.dialogue,
    audio: oldScene.audio,
    notes: oldScene.notes,
    thumbnail: oldScene.thumbnail
  }
}

// 辅助转换函数
function convertLegacyShotType(shotType: string): ShotType {
  switch (shotType) {
    case 'wide': return ShotType.WIDE
    case 'medium': return ShotType.MEDIUM
    case 'close': return ShotType.CLOSE_UP
    case 'extreme_close': return ShotType.EXTREME_CLOSE
    case 'overhead': return ShotType.EXTREME_WIDE
    default: return ShotType.MEDIUM
  }
}

function convertLegacyAngle(angle: string): CameraAngle {
  switch (angle) {
    case 'eye_level': return CameraAngle.EYE_LEVEL
    case 'high': return CameraAngle.HIGH_ANGLE
    case 'low': return CameraAngle.LOW_ANGLE
    case 'dutch': return CameraAngle.DUTCH_ANGLE
    default: return CameraAngle.EYE_LEVEL
  }
}

function convertLegacyMovement(movement: string): CameraMovement {
  switch (movement) {
    case 'static': return CameraMovement.STATIC
    case 'pan': return CameraMovement.PAN_LEFT
    case 'tilt': return CameraMovement.TILT_UP
    case 'zoom': return CameraMovement.ZOOM_IN
    case 'tracking': return CameraMovement.TRACKING
    default: return CameraMovement.STATIC
  }
}